1 using System.Collections;
2 using System.Collections.Generic;
3 using UnityEngine;
4
5
6 public class KingMovement : Movement, IPieceMovement {
7
8 private bool didCastling = false;
9 private Node[,] specialNodes;
10 private Piece[] rooks;
11
12 private GCPlayer p1;
13 private GCPlayer p2;
14 private Grid grid;
15
16 public KingMovement(GCPlayer player, Piece piece) : base(player,piece) {
17 BoundComputations += ComputeBound;
18 specialNodes = new Node[2,2];
19 rooks = new Piece[2];
20 grid = GameManager.Instance.Grid;
21 p1 = GameManager.Instance.P1;
22 p2 = GameManager.Instance.P2;
23 }
24
25 public override void ComputeBound() {
26 Node currNode = piece.Node;
27 int origRow = currNode.row;
28 int origCol = currNode.col;
29
30 for (int row = -1; row <= 1; row++) {
31 for (int col = -1; col <= 1; col++) {
32 if (row == 0 && col == 0) continue;
33
34 int newRow = origRow + row;
35 int newCol = origCol + col;
36 ComputeMoveOrEatPiece(grid.GetNodeAt(newRow, newCol));
37 }
38 }
39
40 if (!moved && !didCastling && !player.IsChecked) {
41 //check left
42 int left = 1;
43 bool freeLeft = true;
44 int sign = GetSign();
45 while (true) {
46 int newCol = origCol - left * sign;
47 if (newCol < 0 || newCol >= grid.Cols) break;
48 Node toCheckNode = grid.GetNodeAt(origRow, newCol);
49
50 if (toCheckNode.EmptySpace) {
51 if (Rules.IsGuardedMove(player,piece,toCheckNode)) {
52 freeLeft = false;
53 break;
54 }
55 } else {
56 Piece cPiece = toCheckNode.Piece;
57 if (Rules.IsAlly(cPiece, piece) && cPiece.PieceType == PieceType.SQUARE) {
58 rooks[0] = cPiece;
59 } else {
60 freeLeft = false;
61 }
62 break;
63 }
64
65
66 left++;
67 }
68 if (freeLeft && !rooks[0].IsMoved) {
69 specialNodes[0,0] = grid.GetNodeAt(origRow, origCol - 1 * sign); //for rook
70 specialNodes[0,1] = grid.GetNodeAt(origRow, origCol - 2 * sign); //for king
71 ComputeMovePiece(specialNodes[0,1]);
72 }
73
74 //check right
75 int right = 1;
76 bool freeRight = true;
77 while (true) {
78 int newCol = origCol + right * sign;
79 if (newCol < 0 || newCol >= grid.Cols) break;
80 Node toCheckNode = grid.GetNodeAt(origRow, newCol);
81
82 if (toCheckNode.EmptySpace) {
83 if (Rules.IsGuardedMove(player,piece,toCheckNode)) {
84 freeRight = false;
85 break;
86 }
87 } else {
88 Piece cPiece = toCheckNode.Piece;
89 if (Rules.IsAlly(cPiece, piece) && cPiece.PieceType == PieceType.SQUARE) {
90 rooks[1] = cPiece;
91 } else {
92 freeRight = false;
93 }
94 break;
95 }
96
97
98 right++;
99 }
100 if (freeRight && !rooks[1].IsMoved) {
101 specialNodes[1,0] = grid.GetNodeAt(origRow, origCol + 1 * sign); //for rook
102 specialNodes[1,1] = grid.GetNodeAt(origRow, origCol + 2 * sign); //for king
103 ComputeMovePiece(specialNodes[1,1]);
104 }
105
106 }
107 }
108
109 int GetSign() {
110 if (player == p1) {
111 return 1;
112 } else {
113 return -1;
114 }
115 }
116
117 public override void Moved() {
118 if (rooks[0] == null && rooks[1] == null) return;
119 if (!moved) {
120 moved = true;
121 if (!didCastling) {
122 if (specialNodes[0,0] != null && piece.Node == specialNodes[0,1]) {
123 rooks[0].MoveToXZ(specialNodes[0,0], UpdateLeftRook);
124 didCastling = true;
125 } else if(specialNodes[1,0] != null && piece.Node == specialNodes[1,1]) {
126 rooks[1].MoveToXZ(specialNodes[1,0], UpdateRightRook);
127 didCastling = true;
128 }
129 }
130 }
131 }
132
133 private void UpdateLeftRook() {
134 rooks[0].UpdateNode(specialNodes[0,0]);
135 }
136
137 private void UpdateRightRook() {
138 rooks[1].UpdateNode(specialNodes[1,0]);
139 }
140 }
check left
specialNodes[0,0] = grid.GetNodeAt(origRow, origCol - 1 * sign); for rook
specialNodes[0,1] = grid.GetNodeAt(origRow, origCol - 2 * sign); for king
check right
specialNodes[1,0] = grid.GetNodeAt(origRow, origCol + 1 * sign); for rook
specialNodes[1,1] = grid.GetNodeAt(origRow, origCol + 2 * sign); for king